#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 1. 简述编写类和执行类中方法的流程。

'''
class Show():  # 创建一个类

    def func(self):  # 创建一个类的方法
        pass


val = Show()  # 实例化Show类的对象
val.func()  # 引用Show对象的方法
'''

# 2. 简述面向对象三大特性?
'''
封装、继承、多态
'''

# 3. 将以下函数改成类的方式并调用 :
'''
class Show():
    def func(self, a1):
        print(a1)

a1 = Show()
a1.func('123')
'''

# 4. 面向对象中的self指的是什么?
'''
self 代表的是类的实例，代表当前对象的地址
'''

# 5.以下代码体现面向对象的什么特点?
'''
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
    # 封装，将值保存在对象中，代以后方便使用。

obj = Person('武沛齐', 18, '男')
'''

# 6. 以下代码体现面向对象的什么特点
'''
class Message:
    def email(self):
        """
        发送邮件
        :return:
        """
        pass
    def msg(self):
        """
        发送短信
        :return:
        """
        pass
    def wechat(self):
        """
        发送微信
        :return:
        """
        pass
        
        #  封装，将值保存在对象中，代以后方便使用。
'''

# 7. 看代码写结果
'''
class Foo:
    def func(self):
        print('foo.func')
        
obj = Foo()
result = obj.func()
print(result)
# foo.func
# None 
'''

# 8.定义个类，其中有计算周长和面积的方法(圆的半径通过参数传递到初始化方法)。

'''
class CircleFormula():
    def __init__(self, r):
        self.r = r

    def circumference(self):
        result = 2 * 3.14 * self.r
        print(round(result, 2))


result = CircleFormula()
result.circumference(4)
'''
'''
import math

class CircleFormula():
    def __init__(self, r):
        self.r = r

    def circumference(self):
        result = 2 * math.pi * self.r
        print(round(result, 2))


result = CircleFormula()
result.circumference(4)
'''

# 9.面向对象中为什么要有继承?
'''
增强重用性，多个类如果需要共同的方法，写在基类中避免重复编写。
'''

# 10.Python继承时，查找成员的顺序遵循什么规则?
'''
从左到右的顺序，一个基类查到底没有时才会查找第二个基类。
'''

# 11.看代码写结果
'''
class Base1:
    def f1(self):
        print('base1.f1')

    def f2(self):
        print('base1.f2')

    def f3(self):
        print('base1.f3')
        self.f1()


class Base2:
    def f1(self):
        print('base2.f1')


class Foo(Base1, Base2):
    def f0(self):
        print('foo.f0')
        self.f3()


obj = Foo()
obj.f0()

# foo.f0
# base1.f3
# base1.f1
'''

# 12.看代码写结果:
'''
class Base:
    def f1(self):
        print('base.f1')

    def f3(self):
        self.f1()
        print('base.f3')


class Foo(Base):
    def f1(self):
        print('foo.f1')

    def f2(self):
        print('foo.f2')
        self.f3()


obj = Foo()
obj.f2()
# foo.f2
# foo.f1
# base.f3
'''

# 13.补充代码实现
"""
# 需求
1. while循环提示用户输入: 户名、密码、邮箱(正则满 邮箱格式)
2. 为每个用户创建1个对象，并添加到列表中。
3. 当列表中的添加3个对象后，跳出循环并以此循环打印所有用户的姓名和邮箱
"""
'''
class Myclass():
    def __init__(self, user, pwd, email):
        self.username = user
        self.password = pwd
        self.email = email

    def func(self):
        return '用户名：%s 密码：%s 邮箱：%s' % (self.username,self.password,self.email,)

user_list = []
while True:
    user = input('请输入用户名:')
    pwd = input('请输入密码:')
    email = input('请输入邮箱:')
    if '@' in email:
        print('请输入正确的邮箱')
        continue
    result = Myclass(user, pwd, email)
    user_list.append(result.func())
    if len(user_list) == 3:
        print(user_list)
        break
'''

# 14.补充代码:实现 户注册和登录。
'''
import sys


class User:
    def __init__(self, name, pwd):
        self.name = name
        self.pwd = pwd


class Account:
    def __init__(self):
        # 用户列表，数据格式：[user对象，user对象，user对象]
        self.user_list = []

    def login(self):
        """
        用户登录，输入用户名和密码然后去self.user_list中校验用户合法性
        :return:
        """
        while True:
            user = input('请输入用户名')
            pwd = input('请输入密码：')
            for i in self.user_list:
                if user == i.name and pwd == i.pwd:
                    print('登录成功')
                    return
                print('登录失败')
                continue


    def register(self):
        """
        用户注册，没注册一个用户就创建一个user对象，然后添加到self.user_list中，表示注册成功。
        :return:
        """
        while True:
            name = input('请输入用户名(N返回)：')
            if name.upper() == 'N':
                return
            # if name in self.user_list:
            #     print('用户已存在！')
            #     continue
            pwd = input('请输入密码')
            user_obj = User(name, pwd)
            self.user_list.append(user_obj)
            print('注册成功')
            return

    def run(self):
        """
        主程序
        :return:
        """
        while True:
            home_page = {'1': self.register, '2': self.login}
            print('1.注册\n2.登录')
            num = input('请输入序号(N退出)：')
            if num.upper() == 'N':
                sys.exit('谢谢使用。')
            if home_page.get(num):
                home_page.get(num)()
            else:
                print('请输入正确的序号')
                continue


if __name__ == '__main__':
    obj = Account()
    obj.run()
'''